<template>
  <div style="margin-left: 20vw; width: 80vw">
    <div class="problemText">
      <div>1.两数之和</div>
      <div>
        题目： 给定一个数组 nums 和一个目标值
        target，在该数组中找出和为目标值的两个数
      </div>
      <div>输入： nums: [8, 2, 6, 5, 4, 1, 3] ； target:7</div>
      <div>输出： [2, 5]</div>
    </div>

    <div class="problemText">
      <div>2.三数之和</div>
      <div>
        题目： 给定一个数组nums，判断 nums 中是否存在三个元素a，b，c，使得 a + b
        + c = target，找出所有满足条件且不重复的三元组合
      </div>
      <div>输入： nums: [5, 2, 1, 1, 3, 4, 6] ；target:8</div>
      <div>输出： [[1, 1, 6], [1, 2, 5], [1, 3, 4]]</div>
    </div>

    <div class="problemText">
      <div>3.版本号排序</div>
      <div>题目： 输入一组版本号，输出从大到小的排序</div>
      <div>
        输入： ['2.1.2', '0.402.1', '3.20.1', '0.1.8', '5.1.2', '1.3.4.5']
      </div>
      <div>
        输出： ['5.1.2', '3.20.1', '2.1.2', '1.3.4.5', '0.402.1', '0.1.8']
      </div>
    </div>

    <div class="problemText">
      <div>4.第一个不重复的字符</div>
      <div>题目： 输入一个字符串，找到第一个不重复字符的下标</div>
      <div>输入： 'abcabcde'</div>
      <div>输出： 6</div>
    </div>

    <div class="problemText">
      <div>5、字符串所有排列组合</div>
      <div>题目： 输入一个字符串，打印出该字符串中，所有字符的排列组合</div>
      <div>输入： 'abc'</div>
      <div>输出： ['abc', 'acb', 'bca', 'bac', 'cab', 'cba']</div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      problem1: {
        list: [5, 11, 9, 3, 16, 12, 14, 6],
        target: 15,
        resultList: [],
      },
      problem2: {
        list: [2, 6, 4, 8, 1, 2, 4, 9, 3],
        target: 16,
        resultList: [],
      },
      problem3: {
        list: ["2.1.2", "0.402.1", "3.20.1", "0.1.8", "5.1.2", "1.3.4.5"],
        resultList: [],
      },
      problem4: {
        str: "abcabcde",
        index: 0,
        result: "",
      },
      problem5:{
        str:'abc',
      },
    };
  },
  methods: {
    method1() {
      this.problem1.resultList = [];
      let arr = [...this.problem1.list];
      let target = this.problem1.target;
      let map = {}; // ?不理解map的作用
      for (let i = 0; i < arr.length; i++) {
        // 从map中查找是否有key 等于 target-nums[i]，如果有，则条件成立，返回结果
        if (map[target - arr[i]] !== undefined) {
          this.problem1.resultList.push([target - arr[i], arr[i]]);
          return;
        } else {
          // 条件不成立，将该值存起来
          map[arr[i]] = i;
        }
      }
      this.problem1.resultList.push(["no", "data"]);
      console.log(map);
    },
    method2() {
      let arr = [...this.problem2.list];
      let target = this.problem2.target;
      arr.sort();
      let result = [];
      for (let i = 0; i < arr.length; i++) {
        // 跳过重复的arr[i]值, 比如[2, 1, 1],跳过第二个1
        if (i && arr[i] === arr[i - 1]) continue;
        let left = i + 1;
        let right = arr.length - 1;
        // 双端指针left、right
        while (left < right) {
          let sum = arr[i] + arr[left] + arr[right];
          // 相当于left right指针向中间靠拢
          if (sum > target) {
            right--;
          } else if (sum < target) {
            left++;
          } else {
            // 先取arr[left]，然后left++, 两步合成一步；arr[right--]同样的逻辑
            result.push([arr[i], arr[left++], arr[right--]]);
            while (arr[left] === arr[left - 1]) {
              // 跳过重复的arr[left]值
              left++;
            }
            while (arr[right] === arr[right + 1]) {
              // 跳过重复的arr[right]值
              right--;
            }
          }
        }
      }
      this.problem2.resultList = result;
      console.log(result);
    },
    method3() {
      let arr = [...this.problem3.list];
      arr.sort((a, b) => {
        let aArr = a.split(".");
        let bArr = b.split(".");
        for (let i = 0; i < aArr.length; i++) {
          if (aArr[i] > bArr[i]) {
            return 1;
          } else if (aArr[i] < bArr[i]) {
            return -1;
          }
        }
      });
      this.problem3.resultList = arr;
    },
    method4() {
      let str = this.problem4.str;

      let strList = str.split("");

      let list = {};
      strList.forEach((item, index) => {
        let key = Object.keys(list);
        if (!key.length) {
          list[item] = 0;
        } else {
          let isExist = key.find((item2) => item2 === item);
          if (isExist) {
            list[item]++;
          } else {
            list[item] = 0;
          }
        }
      });

      let key = Object.keys(list);
      let value = Object.values(list);
      let totalIndex = 0
      console.log(list);
      for(let i =0;i<value.length;i++) {
        totalIndex += value[i] + 1
        if (value[i] == 0) {
          this.problem4.index = totalIndex - 1;
          this.problem4.result = key[i];
          return
        }
      }
    },
    method5(){
      let str = this.problem5.str;
      let list = str.split('')
      
    },
  },
  mounted() {
    // 第一题
    this.method1();
    // 第二题
    this.method2();
    // 第三题
    this.method3();
    // 第四题
    this.method4();
  },
};
</script>

<style scoped>
.problemText {
  padding: 1vh;
  color: rgb(255, 255, 255);
}
</style>
<style>
.input-class .el-input__inner {
  height: 4vh;
}
</style>